﻿/**
 * @file   OperateNoiseSpectrogram.h
 * @brief  点击调用二维窗口显示操作器
 * @author WangZhenYu (wangzhenyu@diso.cn)
 * @date   2024-11-27
 * 
 */
#ifndef OPERATENOISESPECTROGRAM_H
#define OPERATENOISESPECTROGRAM_H
#include "FITK_Kernel/FITKCore/FITKActionOperator.h"
#include "FITK_Kernel/FITKCore/FITKOperatorRepo.h"
#include <QString>
#include <QPointF>
#include <QList>
#include <QVector>
#include <QHash>
#include "GUIDialog/GUIPostDialog/GUICurvePlotDialog.h"
namespace GUI
{
    class MainWindow;
}
namespace Acoustics
{
    class FITKAcousticsHDF5LoadCaseManager;
    class FITKAcousticsHDF5LoadCase;
    class FITKAbstractSEASubSys;
}
namespace ModelOper
{
    class OperateNoiseSpectrogram:public Core::FITKActionOperator
    {
        Q_OBJECT;
    public:
        OperateNoiseSpectrogram();
        /**
         * @brief UI相关操作
         * @return  是否成功
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-25 
         */
        virtual bool execGUI() override;
        /**
         * @brief 执行业务操作
         * @return  是否成功
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-25 
         */
        virtual bool execProfession() override;
    private:

        /**
         * @brief 刷新曲线和表格数据
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        bool refreshData();

        /**
         * @brief 获取工况名列表
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        QStringList getCaseNameList();
        /**
         * @brief 获取数据集列表
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        QStringList getDataSetNameList(QString caseName);
        QString getTickSystemType(QString objectname);
        QStringList getSelectDataSetList();
        /**
         * @brief 生成某条曲线的坐标数据
         * @param[i]   xName x轴名称
         * @param[i]   listY y轴名称列表
         * @return  曲线数据坐标
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        QList<QVector<QPointF> > getCurvePoint(QString xName, QList<QString> listY);
        bool loadXData();
        void init();
        /**
         * @brief 初始颜色列表
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        void initColorList();
        /**
         * @brief 加载某个工况下的某个数据集的所有曲线数据
         * @param[i]   caseName 工况名
         * @param[i]   datasetName 数据集名
         * @return  是否成功
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        bool loadCaseData(QString caseName, QString datasetName, QString dataName);
        /**
         * @brief  获取子系统下的数据集列表
         * @param[i]   objectname 节点名
         * @return  返回数据集列表名称集合
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-28
         */
        QList<Acoustics::FITKAbstractSEASubSys*>  getDataSetNameByType(QString objectname);

        QString _subSystemName{};
        /**
         * @brief 保存所有列数据
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QHash<QString, QVector<float>> _colHashdata;
        /**
         * @brief 所有列名
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QList<QString> _colNameList{};
        /**
         * @brief y轴列名列表
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QList<QString> _yList{};
        /**
         * @brief x轴列名
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QString _xName;
        /**
         * @brief 数据行数
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        int _rowCount{ 0 };
        /**
         * @brief 默认数据集名
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QString _defaultDatasetName;

        QList<QColor> _colorList;

        /**
         * @brief 保存子系统的类型 SIFs或SubSystems
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-28
         */
        QString _subSystemType;

        GUI::GUICurvePlotDialog* _curveDialog{};

        Acoustics::FITKAcousticsHDF5LoadCaseManager* _loadCaseManager{};

        GUI::MainWindow* _mainWindow{};

    private slots:
        /**
         * @brief 接收界面返回的工况名和数据集名，重新绘制曲线s
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-28 
         */
        void changeCaseSlot(QString caseName,QString dataSetName);
    };
    // 按钮注册相关操作
    Register2FITKOperatorRepo(actionNoiseSpectrogramResult, OperateNoiseSpectrogram);
    Register2FITKOperatorRepo(actionVibrancySpectrogramResult, OperateNoiseSpectrogram);
    Register2FITKOperatorRepo(actionSemi_infiniteFluidNoise, OperateNoiseSpectrogram);
}


#endif // OPERATENOISESPECTROGRAM_H
